package sv.gob.mh.dgii.dao.security;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.stereotype.Repository;
import sv.gob.mh.dgii.common.PagedResult;
import sv.gob.mh.dgii.common.Utils;
import sv.gob.mh.dgii.dao.hibernate.HibernateDaoImpl;
import sv.gob.mh.dgii.model.AsOpcion;
import sv.gob.mh.dgii.model.AsRol;

@Repository
public class AsOpcionDaoImpl extends HibernateDaoImpl implements AsOpcionDao {      
    public AsOpcionDaoImpl() {
        super(AsOpcion.class);
    }

    @Override
    public List<AsOpcion> findByRole(AsRol role) {
        Session session = getSessionFactory().getCurrentSession();
        Query q = session.createQuery("select distinct o from AsOpcion o join o.roles ro where ro.crol = :crol order by o.smodulo, o.sopcion");
        q.setParameter("crol", role.getCrol());
        return q.list();
    }

    @Override
    public List<AsOpcion> findOnlyPadres() {
        Session session = getSessionFactory().getCurrentSession();
        Query q = session.createQuery("select distinct o from AsOpcion o where o.opcionPadre is null and o.saplicacion = :aplicacion  order by o.smodulo,o.sopcion");
        q.setParameter("aplicacion", "SSC");
        return q.list();
    }

    @Override
    public List<AsOpcion> findHijas(AsOpcion padre) {
        Session session = getSessionFactory().getCurrentSession();
        Query q = session.createQuery("select distinct o from AsOpcion o where o.opcionPadre.copcion=:id  order by o.sopcion");
        q.setParameter("id", padre.getCopcion());
        return q.list();
    }

    @Override
    public AsOpcion findPadre(AsOpcion hija) {
        AsOpcion ret = null;
        Session session = getSessionFactory().getCurrentSession();
        Query q = session.createQuery("select distinct o from AsOpcion o where o.copcion= (select distinct h.opcionPadre.copcion from AsOpcion h where h.copcion=:id)");
        q.setParameter("id", hija.getCopcion());
        List<AsOpcion> list = q.list();
        if (list != null && list.size() > 0) {
            ret = list.get(0);
        }
        return ret;
    }

    @Override
    public List<AsOpcion> findAllOpcionesBySRol(String[] roles) {
        Session session = getSessionFactory().getCurrentSession();
        Query q = session.createQuery("select distinct o from AsOpcion o inner join fetch o.roles ro where ro.srol in (:roles) order by o.smodulo");
        q.setParameterList("roles", roles);
        return q.list();
    }

    @Override
    public List<AsRol> findRolesByOpcion(AsOpcion opcion) {
        Session session = getSessionFactory().getCurrentSession();
        Query q = session.createQuery("select o.roles from AsOpcion o where o.copcion=:id ");
        q.setParameter("id", opcion.getCopcion());
        return q.list();
    }

    @Override
    public PagedResult findModules(int page, int pageSize) {
        PagedResult ret = new PagedResult();
        Query q = getSessionFactory().getCurrentSession().createQuery("SELECT DISTINCT o.smodulo FROM AsOpcion o ORDER BY o.smodulo ");
        List temp = q.list();
        ret.setCounter(temp != null ? temp.size() : 0);
        if (page > 0 && pageSize > 0) {
            q.setFirstResult((page - 1) * pageSize);
            q.setMaxResults(pageSize);
        }
        ret.setList(q.list());
        return ret;
    }

    @Override
    public int replaceModuleName(String oldModuleName, String newModuleName) {
        int ret = 0;
        if (!Utils.isNullOrEmpty(oldModuleName) && !Utils.isNullOrEmpty(newModuleName)) {
            Query q = getSessionFactory().getCurrentSession().createQuery("UPDATE AsOpcion o SET o.smodulo =:newModule WHERE o.smodulo LIKE :oldModule");
            q.setParameter("newModule", newModuleName.trim());
            q.setParameter("oldModule", "%" + oldModuleName.trim() + "%");
            ret = q.executeUpdate();
        }
        return ret;
    }
}
//class